package com.rongmei.jdsync.repository;

import com.rongmei.jdsync.entity.PriceSyncLog;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 价格同步日志Repository
 *
 * @author dongjun
 */
@Repository
public interface PriceSyncLogRepository extends JpaRepository<PriceSyncLog, Long> {

    /**
     * 根据同步批次ID查询日志
     *
     * @param syncBatchId 同步批次ID
     * @return 日志列表
     */
    List<PriceSyncLog> findBySyncBatchId(String syncBatchId);

    /**
     * 根据商品ID查询最近的同步日志
     *
     * @param goodsId 商品ID
     * @return 最近的同步日志
     */
    PriceSyncLog findTopByGoodsIdOrderByCreateTimeDesc(Long goodsId);

    /**
     * 查询指定时间范围内的同步日志
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 日志列表
     */
    List<PriceSyncLog> findByCreateTimeBetween(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 根据同步状态查询日志
     *
     * @param syncStatus 同步状态
     * @return 日志列表
     */
    List<PriceSyncLog> findBySyncStatus(Integer syncStatus);

    /**
     * 查询失败的同步记录（用于重试）
     *
     * @param maxRetryCount 最大重试次数
     * @return 失败的同步记录
     */
    @Query("SELECT p FROM PriceSyncLog p WHERE p.syncStatus = 2 AND p.retryCount < :maxRetryCount")
    List<PriceSyncLog> findFailedLogsForRetry(@Param("maxRetryCount") Integer maxRetryCount);

    /**
     * 统计指定批次的同步结果
     *
     * @param syncBatchId 同步批次ID
     * @return 统计结果 [总数, 成功数, 失败数]
     */
    @Query("SELECT COUNT(p), " +
           "SUM(CASE WHEN p.syncStatus = 1 THEN 1 ELSE 0 END), " +
           "SUM(CASE WHEN p.syncStatus = 2 THEN 1 ELSE 0 END) " +
           "FROM PriceSyncLog p WHERE p.syncBatchId = :syncBatchId")
    Object[] countSyncResultByBatchId(@Param("syncBatchId") String syncBatchId);
}
